import java.util.Scanner;

import ui.OthelloUserInterface;
import ui.UIHulpMethodes;
import ui.UserInterfaceFactory;
import ui.Event;

/**
 * @author bryanonel
 *f
 */
public class OthelloReplay {
	
	/*
	 * Idee! Wat als de othello replayer en het othello spel nu niet onafhankelijk geprogrammeer worden,
	 * maar er een boolean aan het hoofdprogramma wordt toegevoegd dat bepaalt of het spel in replay mode is of niet.
	 */
	
	private OthelloUserInterface ui;
	private Bord bord;
	private BeurtRij beurtRij;
	
	public OthelloReplay() {
		beurtRij = new BeurtRij();
		bord = new Bord();
	}
	
	public void start() {
		UserInterfaceFactory.zetLageResolutie(true);
		ui = UserInterfaceFactory.geefOthelloUI();
		bord.initialiseerBord();
		
		if (UIHulpMethodes.vraagGebruikerOmInvoer()) {
			Scanner in = new Scanner(System.in);
			while (in.hasNextLine()) {
				beurtRij.addBeurt(OthelloSpelScanner.leesBeurt(in));
			}
		}
		
		toonBord();
		ui.toon();
		while (true) {
			Event event = ui.geefEvent();
			verwerkEvent(event);
		}
	}
	
	public void verwerkEvent(Event e) {
		String naam = e.naam;
		String data = e.data;
		if (naam.equals("overige_toets") && data.equalsIgnoreCase("q"))  
			System.exit(0);
		if (naam.equals("pijltje") && (data.equals("L")))
			toonVorigeBeurt();
		if (naam.equals("pijltje") && (data.equals("R")))
			toonVolgendeBeurt();
		if (naam.equals("cijfer") && !(data.equals("0")))
			toonVolgendeBeurten(Integer.parseInt(data));
		if (naam.equals("overige_toets") && !(data.equals("0")))
			if (isGetal(data)) {
				toonVorigeBeurten(toInt(data));
			}
		if (naam.equals("klik")) {
			ui.maakLeeg();
			Scanner in = new Scanner(data);
			Coordinaat klikC = OthelloSpelScanner.leesCoordinaat(in);
			// TODO functie in Bord: boolean occupied(x,y)
			ui.plaatsOmcirkeling(klikC.getX(), klikC.getY());
			ui.plaatsDoorzichtig(klikC.getX(), klikC.getY(),1);
			toonBord();
		}
	}
	
	public void toonBord() {
		for (int i=0; i<bord.veld.length;i++) {
			for (int j=0; j<bord.veld[0].length;j++) {
				ui.plaats(i, j, bord.veld[i][j]);
			}
		}
		ui.toon();
	}
	
	
	/**
	 * Methoden schrijven die naar voren en naar achteren kan op basis van een integer
	 * al wordt het dan wel iets lastiger om te bepalen welke message er getoont moet worden enz..
	 */
	public void toonVolgendeBeurt() {
		toonVolgendeBeurten(1);
	}
	
	void toonVolgendeBeurten(int n) {
		for (int i=0; i<n; i++) {
			Beurt b;
			try {
				b = beurtRij.next();
				bord.addBeurt(b);
				toonBord();
			} catch (Exception e) {
				ui.printf(e.getMessage());
			}
		}
	}
	
	void toonVorigeBeurt() {
		toonVorigeBeurten(1);
	}
	
	void toonVorigeBeurten(int n) {
		for (int i=0; i<n; i++) {
			Beurt b;
			try {
				b = beurtRij.prev();
				bord.removeBeurt(b);
				toonBord();
			} catch (Exception e) {
				ui.printf(e.getMessage());
			}
		}
	}

	public boolean isGetal(String c) {
		try {
			Integer.parseInt(c);
			return true;
		} catch (Exception e) {
			return false;
		}
	}
	
	public int toInt(String c) {
		return Integer.parseInt(c);
	}
	
	public static void main(String[] args) {
		OthelloReplay oth = new OthelloReplay();
		oth.start();
	}
}